package com.haidechizi.leetcode;


/**
 * 给定一个非空二叉树，返回其最大路径和。
 * <p>
 * 本题中，路径被定义为一条从树中任意节点出发，达到任意节点的序列。该路径至少包含一个节点，且不一定经过根节点。
 * <p>
 * 示例 1:
 * <p>
 * 输入: [1,2,3]
 * <p>
 * 1
 * / \
 * 2   3
 * <p>
 * 输出: 6
 * 示例 2:
 * <p>
 * 输入: [-10,9,20,null,null,15,7]
 * <p>
 *    -10
 *    / \
 *   9  20
 *     /  \
 *    15   7
 * <p>
 * 输出: 42
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class _124_二叉树中的最大路径和 {

    public int maxPathSum(TreeNode root) {
        value(root);
        return sum;
    }

    private int sum = Integer.MIN_VALUE;

    // 计算每个节点给福及诶单提供的最大路劲值
    public int value(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int lv = Math.max(value(node.left), 0);
        int rv = Math.max(value(node.right), 0);

        sum = Math.max(sum, node.val + lv + rv);

        return node.val + Math.max(lv, rv);
    }
}
